﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using Manager.FormMain;
using Manager.App_Code;
using System.Linq;
using Manager.Common;
using log4net;
using Manager;

namespace Manager.FormAdd_Edit
{
    public partial class frm_DKKhachLe : DevExpress.XtraEditors.XtraForm
    {
        NewPearl_HotelDataContext db = new NewPearl_HotelDataContext();
        public string MaPhong { get; set; }
        PhieuDangKyPhong phieuDangKy = null;
        PhieuDatPhong phieuDatPhong = null;
        NhomKhach nhomKhach = null;
        public string MaPhongCu = "";

        public frm_DKKhachLe(string _MaPhong)
        {
            InitializeComponent();
            MaPhong = _MaPhong;
        }

        public frm_DKKhachLe(PhieuDangKyPhong _phieuDangKy)
        {
            InitializeComponent();
            phieuDangKy = _phieuDangKy;
        }

        public frm_DKKhachLe(PhieuDatPhong _phieuDatPhong, string _maphong)
        {
            InitializeComponent();
            phieuDatPhong = _phieuDatPhong;
            MaPhong = _maphong;
        }         
        
        private void frm_DKKhachLe_Load(object sender, EventArgs e)
        {
            try
            {
                nhomKhach = db.NhomKhaches.SingleOrDefault(i => i.MaNhomKhach == (int)CommonEnum.NhomKhachHang.KhachVangLai_2);
                cmbQuocGia.DataSource = db.QuocGias.ToList();
                cmbQuocGia.DisplayMember = "TenQuocGia";
                cmbQuocGia.ValueMember = "MaQuocGia";

                //var lstTienTe = db.TienTes.ToList();
                comNgoaiTe.DataSource = db.TienTes.ToList();
                comNgoaiTe.DisplayMember = "TenDonVi";
                comNgoaiTe.ValueMember = "MaDonVi";

                cmbTienTe.DataSource = db.TienTes.ToList();
                cmbTienTe.DisplayMember = "TenDonVi";
                cmbTienTe.ValueMember = "MaDonVi";
                
                cmbLoaiID.SelectedIndex = 0;
                lblGioVao.Text = DateTime.Now.ToString("HH:mm");
                lblGioVao.Refresh();
                if (phieuDatPhong != null) //chuyen tu dat phong sang dang ky phong
                {
                    #region load lai
                    txtMaĐK.Text = DateTime.Now.ToString("ddMMyyyhhmmss");
                    dateEditNgayDen.DateTime = phieuDatPhong.NgayDen.Value;
                    dateEditNgayDi.DateTime = phieuDatPhong.NgayDi.Value;
                    dateNgayTao.DateTime = DateTime.Now;
                    txtTraTruoc.Text = CommonFunction.AddSeparator(phieuDatPhong.TienCoc == null ? 0 : phieuDatPhong.TienCoc.Value);
                    cmbTienTe.SelectedValue = phieuDatPhong.DonViTienTe;
                    txtTien.Text = CommonFunction.AddSeparator(phieuDatPhong.ChiTietPhieuDatPhongs.First().GiaPhong.Value);

                    long maxID = 0;
                    if (db.KhachHangs.Count() > 0)
                        maxID = db.KhachHangs.Max(i => i.MaKH);
                    txtMaKhachHang.Text = (maxID + 1).ToString();
                    txtHoTen.Text = phieuDatPhong.TenKhach;
                    txtSoTaiKhoan.Text = phieuDatPhong.SoTaiKhoan;
                    dateHanTaiKhoan.Text = phieuDatPhong.HanTaiKhoan == null ? "" : phieuDatPhong.HanTaiKhoan.Value.ToString("dd/MM/yyyy");
                    if (!string.IsNullOrEmpty(phieuDatPhong.CMND))
                    {
                        cmbLoaiID.SelectedIndex = 0;
                        txtID.Text = phieuDatPhong.CMND;
                    }
                    else if (!string.IsNullOrEmpty(phieuDatPhong.Passport))
                    {
                        cmbLoaiID.SelectedIndex = 1;
                        txtID.Text = phieuDatPhong.Passport;
                    }
                    txtDienThoai.Text = phieuDatPhong.LienHe;
                    if (!string.IsNullOrEmpty(phieuDatPhong.QuocTich))
                        cmbQuocGia.SelectedValue = phieuDatPhong.QuocTich;
                    txtDiaChi.Text = phieuDatPhong.Diachi;

                    var phong = db.Phongs.SingleOrDefault(i => i.MaPhong == MaPhong);
                    if (phong != null)
                    {
                        txtMaPhong.Text = phong.MaPhong;
                        MaPhongCu = phong.MaPhong;
                        comNgoaiTe.SelectedItem = phong.LoaiPhong1.TienTe;

                        //txtTien.Text = phong.LoaiPhong1.GiaPhong.ToString();
                        txtSoKhach.Text = phong.LoaiPhong1.SoNguoi.ToString() + "";
                    }
                    #endregion
                }
                else if (phieuDangKy == null) //dang ky phong
                {
                    #region dk moi
                    var lstQuocGia = db.QuocGias.Where(i => i.MaQuocGia == "VN").ToList();
                    if (lstQuocGia.Count > 0)
                    {
                        cmbQuocGia.SelectedItem = lstQuocGia.First();
                    }
                    var tienTe = db.TienTes.SingleOrDefault(i => i.MaDonVi == "VND");
                    if (tienTe != null)
                    {
                        comNgoaiTe.SelectedIndex = 0;
                    }
                    long maxID = 0;
                    if (db.KhachHangs.Count() > 0)
                        maxID = db.KhachHangs.Max(i => i.MaKH);
                    txtMaKhachHang.Text = (maxID + 1).ToString();
                    txtMaĐK.Text = DateTime.Now.ToString("ddMMyyyhhmmss");
                    dateEditNgayDen.Text = DateTime.Now.ToShortDateString();
                    dateEditNgayDi.Text = DateTime.Now.AddDays(1).ToShortDateString();
                    dateNgayTao.Text = DateTime.Now.ToShortDateString();
                    if (MaPhong != "")
                    {
                        var phong = db.Phongs.SingleOrDefault(i => i.MaPhong == MaPhong);
                        if (phong != null)
                        {
                            txtMaPhong.Text = phong.MaPhong;
                            comNgoaiTe.SelectedItem = phong.LoaiPhong1.TienTe;

                            txtTien.Text = phong.LoaiPhong1.GiaPhong.ToString();
                            txtSoKhach.Text = phong.LoaiPhong1.SoNguoi.ToString() + "";
                        }
                    }
                    #endregion
                }
                else //hieu chinh dang ky phong
                {
                    #region load lai
                    lblGioVao.Text = phieuDangKy.GioVao + ":" + phieuDangKy.PhutVao;
                    lblGioVao.Refresh();
                    txtMaĐK.Text = phieuDangKy.MaPhieu.ToString();
                    dateEditNgayDen.DateTime = phieuDangKy.NgayDen.Value;
                    dateEditNgayDi.DateTime = phieuDangKy.NgayDi.Value;
                    dateNgayTao.DateTime = phieuDangKy.NgayDat.Value;
                    txtSoKhach.Text = phieuDangKy.SoNguoi == null ? "" : phieuDangKy.SoNguoi.ToString();
                    txtTraTruoc.Text = CommonFunction.AddSeparator(phieuDangKy.TraTruoc == null ? 0 : phieuDangKy.TraTruoc.Value);
                    cmbTienTe.SelectedValue = phieuDangKy.TienTe;
                    comNgoaiTe.SelectedValue = phieuDangKy.ChiTietPhieuDangKy.MaTienTe;
                    txtTien.Text = CommonFunction.AddSeparator(phieuDangKy.ChiTietPhieuDangKy.GiaPhong.Value);
                    var khachHang = phieuDangKy.ChiTietPhieuDangKy.KhachHang;
                    txtMaKhachHang.Text = phieuDangKy.MaKhachHang.ToString();
                    txtHoTen.Text = khachHang.TenKH;
                    txtSoTaiKhoan.Text = khachHang.SoTaiKhoan;
                    dateHanTaiKhoan.Text = khachHang.HanTaiKHoan == null ? "" : khachHang.HanTaiKHoan.Value.ToShortDateString();
                    if (!string.IsNullOrEmpty(khachHang.CMND))
                    {
                        cmbLoaiID.SelectedIndex = 0;
                        txtID.Text = khachHang.CMND;
                    }
                    else if (!string.IsNullOrEmpty(khachHang.Passport))
                    {
                        cmbLoaiID.SelectedIndex = 1;
                        txtID.Text = khachHang.Passport;
                    }
                    txtDienThoai.Text = khachHang.DienThoai;
                    cmbQuocGia.SelectedValue = khachHang.QuocGia.MaQuocGia;
                    txtDiaChi.Text = khachHang.DiaChi;;
                    if (khachHang.Nu.Value)
                    {
                        ckNu.Checked = true;
                    }
                    else
                        ckNam.Checked = true;
                    txtGhiChu.Text = phieuDangKy.GhiChu;
                    var phong = db.Phongs.SingleOrDefault(i => i.MaPhong == phieuDangKy.ChiTietPhieuDangKy.MaPhong);
                    if (phong != null)
                    {
                        txtMaPhong.Text = phong.MaPhong;
                        MaPhongCu = phong.MaPhong;                        

                        //txtTien.Text = phong.LoaiPhong1.GiaPhong.ToString();
                        txtSoKhach.Text = phong.LoaiPhong1.SoNguoi.ToString() + "";
                    }
                    #endregion
                }
            }
            catch (Exception ex)
            {
                Log.WriteLog("frm_DKKhachLe:frm_DKKhachLe_Load " + ex.Message + "\n" + ex.StackTrace);
                MessageBox.Show("Có lỗi xảy ra!!!");
            }
        }        

        private int Validate()
        {
            int flag = 0;
            if (dateEditNgayDi.Text == "")
            {
                dxErrorProvider1.SetError(dateEditNgayDi, "Vui lòng chọn Ngày đi");
                flag = 1;
            }
            if (dateEditNgayDen.Text == "")
            {
                dxErrorProvider1.SetError(dateEditNgayDen, "Vui lòng chọn ngày đến");
                flag = 1;
            }
            if (txtMaPhong.Text == "")
            {
                dxErrorProvider1.SetError(txtMaPhong, "Vui lòng chọn hoặc nhập Mã phòng");
                flag = 1;
            }            
            if (txtHoTen.Text == "")
            {
                dxErrorProvider1.SetError(txtHoTen, "Vui lòng nhập họ tên khách hàng");
                flag = 1;
            }
            return flag;
        }        

        public void butLoadRoom_Click(object sender, EventArgs e)
        {
            Frm_ListRoom listRoom = new Frm_ListRoom();
            listRoom.FormClosed += new FormClosedEventHandler(listRoom_FormClosed);
            listRoom.ShowDialog();
        }

        void listRoom_FormClosed(object sender, FormClosedEventArgs e)
        {
            var lstRoom = (Frm_ListRoom)sender;
            txtMaPhong.Text = lstRoom.phong.MaPhong;
            txtTien.Text = lstRoom.phong.LoaiPhong1.GiaPhong.ToString();
            txtSoKhach.Text = lstRoom.phong.LoaiPhong1.SoNguoi.Value.ToString() + "";
            comNgoaiTe.SelectedValue = lstRoom.phong.LoaiPhong1.TienTe.MaDonVi;
        }
        
        private void btnCapNhat_Click(object sender, EventArgs e)
        {
            try
            {
                if (txtMaPhong.Text == "")
                {
                    MessageBox.Show("Vui lòng chọn phòng!", "Thông Báo");
                    butLoadRoom.Focus();
                }
                else
                {
                    if (Validate() == 0)
                    {
                        dxErrorProvider1.ClearErrors();
                    }
                    else
                    {
                        MessageBox.Show("Có lỗi xảy ra!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                    // So sánh ngày đến và ngày đi
                    if (dateEditNgayDi.DateTime < dateEditNgayDen.DateTime)
                    {
                        MessageBox.Show("Ngày đi phải lớn hơn hoặc bằng Ngày đến!", "Thông báo");
                        dateEditNgayDi.Focus();
                        return;
                    }                    

                    if (phieuDangKy == null)
                    {                        
                        //ktra phong da dc dang ky hay chua
                        var pdk = db.PhieuDangKyPhongs.Where(t => t.ChiTietPhieuDangKy.MaPhong == txtMaPhong.Text && t.TinhTrang == false);
                        if (pdk.Count() > 0)
                        {
                            MessageBox.Show("Phòng này đã được đăng ký, vui lòng kiểm tra lại!!!");
                            return;
                        }                        
                        phieuDangKy = InsertOrUpdate();
                        Log.WriteLog("Đăng ký phòng mới: " + phieuDangKy.ChiTietPhieuDangKy.MaPhong);
                    }
                    else
                    {
                        Log.WriteLog("Chuyển phòng");
                        var temp = db.PhieuDangKyPhongs.SingleOrDefault(i => i == phieuDangKy);
                        // chuyen phong
                        if (txtMaPhong.Text != phieuDangKy.ChiTietPhieuDangKy.MaPhong)
                        {
                            #region update
                            var kh = db.KhachHangs.SingleOrDefault(t => t.MaKH == temp.MaKhachHang);
                            if (kh != null)
                            {
                                var ngayO = (temp.NgayDi.Value - temp.NgayDen.Value).Days;
                                if (ngayO <= 0)
                                    ngayO = 1;
                                kh.SoNgayO = kh.SoNgayO == null ? 0 : kh.SoNgayO.Value - ngayO;
                            }
                            db.ChiTietPhieuDangKies.DeleteOnSubmit(temp.ChiTietPhieuDangKy);
                            db.PhieuDangKyPhongs.DeleteOnSubmit(temp);
                            Log.WriteLog("Xóa phiếu cũ: " + temp.ChiTietPhieuDangKy.MaPhong);
                            phieuDangKy = InsertOrUpdate();
                            Log.WriteLog("Chuyển qua phòng mới : " + phieuDangKy.ChiTietPhieuDangKy.MaPhong);

                            //chuyen dich vu tu phong cu sang phong moi
                            if (temp.PhuThuDichVus.Count > 0)
                            {
                                foreach (var phuThuDV in temp.PhuThuDichVus)
                                {
                                    phuThuDV.MaPhong = phieuDangKy.ChiTietPhieuDangKy.MaPhong;
                                }
                            }

                            // tinh tien phong cu => chuyen qua cho phong moi
                            var phuThuDichVu = new PhuThuDichVu();
                            phuThuDichVu.MaPhieuDangKy = phieuDangKy.MaPhieu;
                            phuThuDichVu.MaPhong = phieuDangKy.ChiTietPhieuDangKy.MaPhong;
                            phuThuDichVu.TienTe = temp.ChiTietPhieuDangKy.TienTe;
                            var nhomDV = db.NhomDichVus.SingleOrDefault(t => t.MaNhomDV == 4);//get nhom dich vu khac
                            phuThuDichVu.NhomDichVu1 = nhomDV;
                            var soNgayO = (DateTime.Now - temp.NgayDen.Value).Days;
                            var giaPhong = temp.ChiTietPhieuDangKy.GiaPhong.Value;
                            phuThuDichVu.ThanhTien = soNgayO * giaPhong;
                            phuThuDichVu.NgayTao = DateTime.Now;
                            phuThuDichVu.SoLuong = 1;
                            phuThuDichVu.GiaTien = phuThuDichVu.ThanhTien;
                            phuThuDichVu.TenDichVu = string.Format("Chuyển từ phòng {0} sang phòng {1} (từ ngày {2} đến ngày {3})", temp.ChiTietPhieuDangKy.MaPhong, phieuDangKy.ChiTietPhieuDangKy.MaPhong, temp.NgayDen.Value.ToString("dd/MM/yyyy"), DateTime.Now.ToString("dd/MM/yyyy"));
                            
                            db.PhuThuDichVus.InsertOnSubmit(phuThuDichVu);

                            //update tinh trang phong cu                        
                            var phongCu = db.Phongs.SingleOrDefault(i => i.MaPhong == MaPhongCu);
                            phongCu.TinhTrang = ((int)(CommonEnum.TinhTrangPhong.ChuaDon_2)).ToString();
                            #endregion
                        }
                        else
                        {
                            Log.WriteLog("Update thông tin");
                            phieuDangKy = InsertOrUpdate(temp);
                        }
                    }
                    db.SubmitChanges();
                    this.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra!!!");
                Log.WriteLog("frm_DKKhachLe:btnCapNhat_Click " + ex.Message + "\n" + ex.StackTrace);
            }
        }

        private PhieuDangKyPhong InsertOrUpdate(PhieuDangKyPhong phieuDangKy = null)
        {
            string action = "new";
            if (phieuDangKy == null)
                phieuDangKy = new PhieuDangKyPhong();
            else
                action = "edit";
            phieuDangKy.MaPhieu = long.Parse(txtMaĐK.Text);
            phieuDangKy.NgayDen = dateEditNgayDen.DateTime;
            phieuDangKy.NgayDi = dateEditNgayDi.DateTime;
            phieuDangKy.NgayDat = dateNgayTao.DateTime;
            phieuDangKy.GhiChu = txtGhiChu.Text;
            phieuDangKy.SoNguoi = CommonFunction.ParseInt(txtSoKhach.Text);
            phieuDangKy.GioVao = lblGioVao.Text.Split(':')[0];
            phieuDangKy.PhutVao = lblGioVao.Text.Split(':')[1];
            phieuDangKy.TienTe1 = cmbTienTe.SelectedItem as TienTe;
            phieuDangKy.TraTruoc = CommonFunction.ParseDouble(txtTraTruoc.Text);
            phieuDangKy.NguoiDung = Variables.NguoiDung.Username;
            phieuDangKy.TinhTrang = false;

            KhachHang khachHang = null;
            if (cmbLoaiID.SelectedIndex == 0)
                khachHang = db.KhachHangs.SingleOrDefault(t => t.CMND == txtID.Text);
            else
                khachHang = db.KhachHangs.SingleOrDefault(t => t.Passport == txtID.Text);
            if (khachHang == null)
                khachHang = new KhachHang();
            khachHang.TenKH = txtHoTen.Text;
            khachHang.MaNhomKhach = nhomKhach.MaNhomKhach;            
            khachHang.SoTaiKhoan = txtSoTaiKhoan.Text;
            if (dateHanTaiKhoan.Text != "" && dateHanTaiKhoan.DateTime > DateTime.MinValue)
                khachHang.HanTaiKHoan = dateHanTaiKhoan.DateTime;
            if (cmbLoaiID.SelectedIndex == 0)
            {
                khachHang.Passport = "";
                khachHang.CMND = txtID.Text;
            }
            else
            {
                khachHang.CMND = "";
                khachHang.Passport = txtID.Text;
            }
            khachHang.DienThoai = txtDienThoai.Text;
            khachHang.NgayTao = DateTime.Now;
            var quocGia = cmbQuocGia.SelectedItem as QuocGia;
            khachHang.QuocTich = quocGia.MaQuocGia;
            khachHang.DiaChi = txtDiaChi.Text;
            if (ckNam.Checked)
                khachHang.Nu = false;
            else
                khachHang.Nu = true;
            var soNgayO = (dateEditNgayDi.DateTime - dateEditNgayDen.DateTime).Days;
            if (soNgayO <= 0)
                soNgayO = 1;
            khachHang.SoNgayO = khachHang.SoNgayO == null ? soNgayO : khachHang.SoNgayO + soNgayO;

            phieuDangKy.KhachHang = khachHang;
            if (action == "new")
            {
                var chiTietPhieuDangKy = new ChiTietPhieuDangKy();
                chiTietPhieuDangKy.KhachHang = khachHang;
                chiTietPhieuDangKy.MaPhong = txtMaPhong.Text;
                chiTietPhieuDangKy.MaPhieuDangKy = phieuDangKy.MaPhieu;
                chiTietPhieuDangKy.GiaPhong = CommonFunction.ParseDouble(txtTien.Text);
                var tienTe = comNgoaiTe.SelectedItem as TienTe;
                chiTietPhieuDangKy.TienTe = tienTe;
                phieuDangKy.ChiTietPhieuDangKy = chiTietPhieuDangKy;

                db.PhieuDangKyPhongs.InsertOnSubmit(phieuDangKy);
            }
            else
            {
                var chiTietPhieuDangKy = phieuDangKy.ChiTietPhieuDangKy;
                if (chiTietPhieuDangKy != null)
                {
                    chiTietPhieuDangKy.KhachHang = khachHang;
                    chiTietPhieuDangKy.MaPhong = txtMaPhong.Text;
                    chiTietPhieuDangKy.MaPhieuDangKy = phieuDangKy.MaPhieu;
                    chiTietPhieuDangKy.GiaPhong = CommonFunction.ParseDouble(txtTien.Text);
                    var tienTe = comNgoaiTe.SelectedItem as TienTe;
                    chiTietPhieuDangKy.TienTe = tienTe;
                }
            }

            //update tinh trang phong            
            var phong = db.Phongs.SingleOrDefault(i => i.MaPhong == phieuDangKy.ChiTietPhieuDangKy.MaPhong);
            phong.TinhTrang = ((int)(CommonEnum.TinhTrangPhong.CoKhach_3)).ToString();

            return phieuDangKy;
        }

        private void btnThoat_Click(object sender, EventArgs e)
        {
            this.Close();            
        }       

        private void txtPassport_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
            {
                e.Handled = true;
            }
        }

        private void txtDienThoai_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
            {
                e.Handled = true;                
            }
        }        

        private void frm_DKKhachLe_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F4)
                this.btnCapNhat_Click(sender, e);
            else if (e.KeyCode == Keys.Escape)
                this.btnThoat_Click(sender, e);            
        }

        private void btnTimKiem_Click(object sender, EventArgs e)
        {
            frm_SearchCustomer searchCustomer = new frm_SearchCustomer();
            searchCustomer.FormClosed += new FormClosedEventHandler(searchCustomer_FormClosed);
            searchCustomer.ShowDialog();
        }

        void searchCustomer_FormClosed(object sender, FormClosedEventArgs e)
        {
            var frm = sender as frm_SearchCustomer;
            if (frm.khachHang != null)
            {
                var kh = frm.khachHang;
                txtMaKhachHang.Text = kh.MaKH.ToString();
                txtHoTen.Text = kh.TenKH;
                if (!string.IsNullOrEmpty(kh.CMND))
                {
                    cmbLoaiID.SelectedIndex = 0;
                    txtID.Text = kh.CMND;
                }
                else if (!string.IsNullOrEmpty(kh.Passport))
                {
                    cmbLoaiID.SelectedIndex = 1;
                    txtID.Text = kh.Passport;
                }
                txtDienThoai.Text = kh.DienThoai;
                cmbQuocGia.SelectedValue = kh.QuocGia.MaQuocGia;
                txtDiaChi.Text = kh.DiaChi; ;
                if (kh.Nu.Value)
                {
                    ckNu.Checked = true;
                }
                else
                    ckNam.Checked = true;
            }
        }

        private void txtID_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (cmbLoaiID.SelectedIndex == 0)
            {
                if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
                {
                    e.Handled = true;
                }
            }
        }        

        private void txtMaQuocGia_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                var quocGia = db.QuocGias.SingleOrDefault(t => t.MaQuocGia == (txtMaQuocGia.Text).ToUpper());
                if (quocGia != null)
                    cmbQuocGia.SelectedItem = quocGia;
            }
        }        

        private void txtMaQuocGia_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.KeyChar = char.ToUpper(e.KeyChar);
        }    
    }
}